package es.deusto.ingenieria.is.search.tsp.formulation;

import java.awt.Point;
import java.util.ArrayList;


/**
 * @author Kevin e Inigo
 * Clase que representa a cada ciudad de nuestro problema.
 */
public class Ciudad extends Point implements Cloneable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Nombre de cada ciudad. EN nuestro caso tomara valores como A, B, C ...
	 */
	private String nombre;

	/**
	 * Las ciudades a las que puede llegar la ciudad
	 */
	private ArrayList<Ciudad> posiblesCiudades;

	/**
	 * Constructor principal. Da valor a los tres atributos de dicha clase.
	 * @param x
	 * @param y
	 * @param nombre
	 */
	public Ciudad(int x, int y, String nombre) {
		super(x,y);
		this.nombre = nombre;

	}


	/**Completa el array de posible ciuadades a visitar de dicha ciudad
	 * @param posiblesCiudades
	 */
	public void setPosiblesCiudades(ArrayList<Ciudad> posiblesCiudades) {
		this.posiblesCiudades = posiblesCiudades;
	}


	/**Devuelve la coordenada X en la que se encuentra dicha ciudad
	 * @return x
	 */
	public int getPosX() {
		return super.x;
	}

	/**Devuelve la coordenada Y en la que se encuentra dicha ciudad
	 * @return y
	 */
	public int getPosY() {
		return super.y;
	}

	/* (non-Javadoc)
	 * @see java.awt.Point#toString()
	 * Metodo que nos permite sacar por consola el nombre y coordenadas de la ciudad.
	 */
	public String toString() {
		// TODO Auto-generated method stub

		return nombre;
	}

	/** Devuelve el nombre de la ciudad
	 * @return nombre
	 */
	public String getNombre()
	{
		return nombre;
	}
	
	/** Devuelve el array de las posibles ciudades que pude visitar dicha ciudad, es decir todas aquellas que no hayan sido visitadas con enterioridad.
	 * @return posiblesCiudades
	 */
	public ArrayList<Ciudad> getCiudadesPosibles()
	{
		return posiblesCiudades;
		
	}

	/* (non-Javadoc)
	 * @see java.awt.Point#equals(java.lang.Object)
	 * Compara si dos ciudades son iguales. Para ello compara su coordenada X e Y.
	 */
	public boolean equals(Object obj) {
		if (obj != null && obj instanceof Ciudad) {
			return super.equals(new Point(((Ciudad)obj).x, ((Ciudad)obj).y));
		} else {
			return false;
		}
	}

	/* (non-Javadoc)
	 * @see java.awt.geom.Point2D#clone()
	 *  Copia una ciudad, Para ello primero clonamos las coordenadas x,y a partir del clon de su padres y despues anadimos las ciudades 
	 *  posibles al array de la ciudad a anadir.
	 */
	public Object clone() {
		Ciudad clon = null;

		clon = (Ciudad) super.clone();

		for(Ciudad c : this.posiblesCiudades) {
			clon.posiblesCiudades.add(c);

		}

		return clon;
	}

}
